#define _CRT_SECURE_NO_WARNINGS
//作者：宋安康
#include<stdio.h>
//结构体实现位段
//位段是基于结构体的
//1. 位段的成员必须是 int、unsigned int 或signed int ，在C99中位段成员的类型也可以
//选择其他类型。
//2. 位段的成员名后边有⼀个冒号和⼀个数字。
struct A
{
	int _a : 2;  //位段
	int _b : 5;
	int _c : 10;
	int _d : 30;
	//变量名：数字 字母 下划线
};//47个比特位 -- 8个字节

//位段的出现就是为了节省空间
//1. 位段的成员可以是 int unsigned int signed int 或者是 char 等类型
//2. 位段的空间上是按照需要以4个字节（ int ）或者1个字节（ char ）的⽅式来开辟的。
//3. 位段涉及很多不确定因素，位段是不跨平台的，注重可移植的程序应该避免使⽤位段。 ---依赖平台的


//int main() 
//{
//	//⼀个例⼦
//	struct S
//	{
//		char a : 3;
//		char b : 4;
//		char c : 5;
//		char d : 4;
//	};
//	struct S s = { 0 };
//	s.a = 10;
//	s.b = 12;
//	s.c = 3;
//	s.d = 4;
//	//空间是如何开辟的？ -- 调试看内存
//	//1,从右向左使用
//	//2,如果剩余的空间不够下一个成员使用，就浪费
//	printf("%d\n",sizeof(struct A));
//	printf("%d\n",sizeof(s));
//}//跟结构相⽐，位段可以达到同样的效果，并且可以很好的节省空间，但是有跨平台的问题存在。

//位段的应用

//联合体（共用体）
//联合体类型的声明
//像结构体⼀样，联合体也是由⼀个或者多个成员构成，这些成员可以不同的类型。
//但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所
//以联合体也叫：共⽤体。
//给联合体其中⼀个成员赋值，其他成员的值也跟着变化。
union u 
{
	char c;
	int i;
};
int main() 
{
	union u uu;
	printf("%zd\n",sizeof(uu));
	printf("%zd\n",&uu);   //联合体的成员在共用一块空间（共用体）
	printf("%zd\n",&(uu.c));
	printf("%zd\n",&(uu.i));
	return 0;
}
//联合的成员是共⽤同⼀块内存空间的，这样⼀个联合变量的⼤⼩，⾄少是最⼤成员的⼤⼩（因为联合
//⾄少得有能⼒保存最⼤的那个成员）。